Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Paged File, I/O System] 초코칩(권기호) 미션 제출합니다. #3

Open
wants to merge 27 commits into
base: Chocochip101
Choose a base branch
from

Conversation

Chocochip101
Copy link
Member

@Chocochip101 Chocochip101 commented Aug 27, 2024

페이지는 어떻게 구성되나요?

아래 그림의 페이지의 구조를 참고하여 구현했습니다.

image

public class Page implements Serializable {

    private static final int PAGE_SIZE = 16 * 1024;

    private final FileHeader fileHeader;
    private final PageHeader pageHeader;
    private final List<StorageRecord> userStorageRecords;
    private final PageDirectory pageDirectory;
    private int freeSpace;
    // ....

}

FileTrailer는 Page의 유효성을 검사하는 역할인데, 현재 단계에서는 굳이 필요성을 못느껴 구현하지 않았습니다.

페이지 교체 알고리즘은 어떤 것으로 결정하고, 왜 결정했나요?

FIFO는 성능이 안좋다고 알려져 있어, 당장 구현하기 좋았던 LRU 알고리즘을 적용했습니다. 어떤 알고리즘이 좋은지 몰라서, 알고리즘이 변경될 가능성이 있다고 판단했습니다. 따라서 전략 패턴을 적용해서 알고리즘을 교체할수 있게 구현했습니다.

@Chocochip101 Chocochip101 added the enhancement New feature or request label Sep 2, 2024
import java.util.ArrayList;
import java.util.List;

public class Page implements Serializable {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Serializable을 이용해서 페이지를 구현해주셨군요.

추후에 페이지 구조가 변경되면 이미 저장된 데이터를 역직렬화 할 수 있을까요?

우리가 만든 DBMS가 완성되어 사용자가 테이블을 만들어 데이터를 추가한 상황에서 페이지 클래스의 필드가 추가되거나 삭제, 수정되면 기존 데이터를 역직렬화 할 수 있나요?

@@ -0,0 +1,16 @@
package database.storageEngine.page;

public class PageFactory {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이부분은 Page 클래스에 정적 팩토리 메서드로 만들 수 있는데 따로 팩토리 클래스를 만든 이유가 궁금합니다. 초코칩이 생각하는 분리의 기준이 있나요? 궁금해요!

this.pageHeader = new PageHeader(pageType);
this.userStorageRecords = new ArrayList<>();
this.pageDirectory = new PageDirectory();
this.freeSpace = PAGE_SIZE - (this.fileHeader.getHeaderSize() + this.pageHeader.getHeaderSize());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

freeSpace를 계산할때 pageDirectory의 크기는 고려되지 않고 있는데요. freeSpace가 레코드로 가득 찬경우 pageDirectory의 크기 때문에 PAGE_SIZE가 초과되는 문제는 없을까요?


private static final int PAGE_SIZE = 16 * 1024;
private static final String DIRECTORY_PATH = "disk";
private static final String FILE_EXTENSION = ".ibd";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추후에 테이블의 스키마를 저장한다면 .ibd 외에 다른 확장자 파일을 만들 수도 있을것 같아요. 그때 이 클래스를 재활용 할 수 있을것 같은데 파일확장자는 상수가 아닌 인자로 받는건 어떤가요?

return Optional.of(page);
}
} catch (IOException | ClassNotFoundException e) {
return Optional.empty();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IOException에 대해서 Optional.empty()을 리턴해도 문제가 없을까요? 파일을 읽는 과정에서 문제가 발생했을때 페이지가 없다고 하면 추후에 버그가 발생했을때 잡기 어려운 코드가 될 수 있을것 같아요.

private static final int HEADER_SIZE = 38;

private final long pageNumber;
private final long checksum;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

checksum은 어떤역할인가요!?

Copy link
Collaborator

@seokmyungham seokmyungham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 초코칩~ 코드 재미있게 봤어요 😀
저랑 구현하시는 방향이 전체적으로 비슷한 것 같아서 재미있었습니다 😊

궁금한 부분과 간단한 코멘트 남겨놨습니다. 😎


private static final int HEADER_SIZE = 38;

private final long pageNumber;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 페이지 번호 자료형을 int로 사용했는데 long 타입을 사용할만큼 파일 크기가 커질지..?
적절한 자료형을 잘 모르겠습니다 어떻게 생각하시나요

@HaiSeong
Copy link
Collaborator

HaiSeong commented Sep 2, 2024

코드 잘 봤습니다!
페이지 교체 알고리즘을 추가로 구현하셨군요. 좋은 학습 마인드셋 입니다!

앞으로도 화이팅입니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants